共计 1775 个字符,预计需要花费 5 分钟才能阅读完成。
引入
shutil 对压缩包的处理实际上是调用了 ZipFile 与 TarFile 这两个模块
一.zipfile 模块
1. 什么是 zipfile 模块
- zipfile 模块是 Python 里用来做 zip格式编码压缩和解压缩的工具, 在Windows 中常见的就是 zip 格式的压缩包, 所以这个模块也是比较常用的
2.ZipFile 类的使用
- 模块中 ZipFile 类的组要功能是创建和读取 zip 文件
import zipfile,os
🔰压缩
import zipfile
z = zipfile.ZipFile("shawn.zip","w") # 得到一个对象赋值给 z
z.write("./bbb") # 将 "bbb" 这个目录加入压缩包
z.write("./ttt.txt") # 将 "ttt.txt" 加入压缩包
z.close() # 关闭文件, 结束时必须要有
print(os.listdir("./")) # ['bbb', 'ccc', 'shawn.zip', 'ttt.txt']
🔰解压
z = zipfile.ZipFile("shawn.zip","r")
z.extractall(path="./ccc") # 解压到 "./ccc" 中
z.close()
print(os.listdir("./ccc")) # ['bbb', 'ttt.txt']
3. 解压加密 zip 文件
-
目前 zipfile 模块支持 zip 格式加密文件的解密, 但 目前无法创建加密文件
-
并且解密文件目前 只支持传统的加密算法: ZipCrypto, 其他不支持:AES-256
import zipfile
f = zipfile.ZipFile("./ab.zip","r")
f.extractall(".",pwd=b"123") # 填写解压的路径以及密码, 密码需转成 Bytes 类型
f.close()
4. 字符串(str) 与字节(Bytes) 的转换
🍓将字符串转 "bytes" (也可以直接在字符串前面写一个小 b)
str1 = "123"
b = bytes(str1,encoding="utf-8")
print(b,type(b)) # b'123' <class 'bytes'>
🍓将 "bytes" 转字符串
b = b'123'
str2 = b.decode("utf-8")
print(str2,type(str2)) #123 <class 'str'>
🍓将 bytes 转成字符串
b = b"123"
str3 = str(b,encoding="utf-8")
print(str3,type(str3)) # 123 <class 'str'>
二.tarfile 模块
import tarfile,os
🔰压缩
t = tarfile.open("./song.tar","w")
t.add("./bbb",arcname="bbb.bak") # 将 "bbb" 这个目录加入压缩包
t.add("./ttt.txt",arcname="ttt.bak") # # 将 "ttt.txt" 加入压缩包
t.close()
print(os.listdir("./")) # ['bbb', 'ccc', 'song.tar', 'ttt.txt']
🔰解压
t = tarfile.open("./song.tar","r")
t.extractall("./ccc") # 解压到 "./ccc" 中
t.close()
print(os.listdir("./ccc")) # ['bbb.bak', 'ttt.bak']
三.zip 压缩包密码暴力破解
1. 先准备一个密码库
2. 准备一个 zip 压缩包, 使用的是传统算法加密的密码
- 我设置的密码 : 123
3. 编写循环比对程序
import zipfile
with open("passwd.lib","r")as lib:
li = lib.read().strip().split(",")
for passwd in li:
f = zipfile.ZipFile("./ab.zip","r")
try:
f.extractall(".",pwd=bytes(passwd,encoding="utf-8"))
print(" 解压成功 ")
f.close()
break
except RuntimeError:
...
else:
print(" 沒有匹配的密码 ")
4. 测试
- 我在密码库里是没有放 "123" 这个密码的, 所以第一次应该是不成功的
- 我们在密码库里边加入密码 "123" 再来一次
可以发现已经解压成功了
正文完